#include "exec_arguments.h"

namespace netaos {
namespace nosal {
namespace exec {
namespace internal {

ExecArguments::ExecArguments()
    : ExecArguments(1U)
{ }

ExecArguments::ExecArguments(size_t reserve)
{
    arguments_.reserve(reserve);
}

ExecArguments::ExecArguments(const std::vector<std::string>& arguments)
    : ExecArguments(arguments.size())
{
    for (const auto& argument : arguments) {
        AddArgument(argument);
    }
}

ExecArguments::ExecArguments(const ExecArguments& other)
    : ExecArguments(other.arguments_)
{ }

void ExecArguments::AddArgument(const std::string& argument)
{
    arguments_.emplace_back(argument);
}

const char* const* ExecArguments::GetArgv()
{
    argv_.clear();
    argv_.reserve(arguments_.size() + 1U);

    for (const std::string& argument : arguments_) {
        argv_.push_back(argument.c_str());
    }

    argv_.push_back(NULL);

    return argv_.data();
}
}  // namespace internal
}  // namespace exec
}  // namespace nosal
}  // namespace netaos
